gdk: Make csw windows have their own cairo surface
authorBenjamin Otte <otte@redhat.com>
Thu, 26 Aug 2010 08:15:59 +0000 (10:15 +0200)
committerBenjamin Otte <otte@redhat.com>
Sun, 26 Sep 2010 13:11:11 +0000 (15:11 +0200)
With Cairo 1.10 now having cairo_surface_create_for_rectangle(), we can
use them. No need to create multiple native surfaces for the same X
window (ugh) anymore.

gdk/gdkwindow.c

index 5c1c1467bc7eb1bdfc6723af7b5d9a38038770ba..ad04143385980ba7b81bfecdd87b607a575a6921 100644 (file)
@@ -1040,27 +1040,14 @@ recompute_visible_regions_internal (GdkWindowObject *private,
       recompute_visible_regions_internal (private->parent, TRUE, FALSE, FALSE);
     }
 
-  if (private->cairo_surface)
+  if (private->cairo_surface &&
+      (!gdk_window_has_impl (private) ||
+       !_gdk_windowing_set_cairo_surface_size (private->cairo_surface,
+                                               private->width,
+                                               private->height)))
     {
-      int width, height;
-
-      /* It would be nice if we had some cairo support here so we
-        could set the clip rect on the cairo surface */
-      width = private->abs_x + private->width;
-      height = private->abs_y + private->height;
-
-      if (_gdk_windowing_set_cairo_surface_size (private->cairo_surface,
-                                                 width, height))
-        {
-          cairo_surface_set_device_offset (private->cairo_surface,
-                                           private->abs_x,
-                                           private->abs_y);
-        }
-      else
-        {
-          cairo_surface_destroy (private->cairo_surface);
-          private->cairo_surface = NULL;
-        }
+      cairo_surface_destroy (private->cairo_surface);
+      private->cairo_surface = NULL;
     }
 }
 
@@ -3736,7 +3723,20 @@ gdk_window_create_cairo_surface (GdkDrawable *drawable,
                                 int width,
                                 int height)
 {
-  return _gdk_drawable_ref_cairo_surface (GDK_WINDOW_OBJECT(drawable)->impl);
+  GdkWindowObject *private = GDK_WINDOW_OBJECT(drawable);
+  cairo_surface_t *surface, *subsurface;
+  
+  surface =_gdk_drawable_ref_cairo_surface (private->impl);
+  if (gdk_window_has_impl (private))
+    return surface;
+
+  subsurface = cairo_surface_create_for_rectangle (surface,
+                                                   private->abs_x,
+                                                   private->abs_y,
+                                                   width,
+                                                   height);
+  cairo_surface_destroy (surface);
+  return subsurface;
 }
 
 
@@ -3761,23 +3761,14 @@ gdk_window_ref_cairo_surface (GdkDrawable *drawable)
 
       if (!private->cairo_surface)
        {
-         int width, height;
-
-         /* It would be nice if we had some cairo support here so we
-            could set the clip rect on the cairo surface */
-         width = private->abs_x + private->width;
-         height = private->abs_y + private->height;
-
-         private->cairo_surface = _gdk_drawable_create_cairo_surface (drawable, width, height);
+         private->cairo_surface = _gdk_drawable_create_cairo_surface (drawable,
+                                                                       private->width,
+                                                                       private->height);
 
          if (private->cairo_surface)
            {
              private->impl_window->outstanding_surfaces++;
 
-             cairo_surface_set_device_offset (private->cairo_surface,
-                                              private->abs_x,
-                                              private->abs_y);
-
              cairo_surface_set_user_data (private->cairo_surface, &gdk_window_cairo_key,
                                           drawable, gdk_window_cairo_surface_destroy);
            }